{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss: -18.00, gradient: -36.00\n",
      "loss: -14.40, gradient: -28.80\n",
      "loss: -11.52, gradient: -23.04\n",
      "loss: -9.22, gradient: -18.43\n",
      "loss: -7.37, gradient: -14.75\n",
      "loss: -5.90, gradient: -11.80\n",
      "loss: -4.72, gradient: -9.44\n",
      "loss: -3.77, gradient: -7.55\n",
      "loss: -3.02, gradient: -6.04\n",
      "loss: -2.42, gradient: -4.83\n",
      "loss: -1.93, gradient: -3.87\n",
      "loss: -1.55, gradient: -3.09\n",
      "loss: -1.24, gradient: -2.47\n",
      "loss: -0.99, gradient: -1.98\n",
      "loss: -0.79, gradient: -1.58\n",
      "loss: -0.63, gradient: -1.27\n",
      "loss: -0.51, gradient: -1.01\n",
      "loss: -0.41, gradient: -0.81\n",
      "loss: -0.32, gradient: -0.65\n",
      "loss: -0.26, gradient: -0.52\n",
      "loss: -0.21, gradient: -0.42\n",
      "loss: -0.17, gradient: -0.33\n",
      "loss: -0.13, gradient: -0.27\n",
      "loss: -0.11, gradient: -0.21\n",
      "loss: -0.09, gradient: -0.17\n",
      "loss: -0.07, gradient: -0.14\n",
      "loss: -0.05, gradient: -0.11\n",
      "loss: -0.04, gradient: -0.09\n",
      "loss: -0.03, gradient: -0.07\n",
      "loss: -0.03, gradient: -0.06\n",
      "loss: -0.02, gradient: -0.04\n",
      "loss: -0.02, gradient: -0.04\n",
      "loss: -0.01, gradient: -0.03\n",
      "loss: -0.01, gradient: -0.02\n",
      "loss: -0.01, gradient: -0.02\n",
      "loss: -0.01, gradient: -0.01\n",
      "loss: -0.01, gradient: -0.01\n",
      "loss: -0.00, gradient: -0.01\n",
      "loss: -0.00, gradient: -0.01\n",
      "loss: -0.00, gradient: -0.01\n",
      "loss: -0.00, gradient: -0.00\n",
      "loss: -0.00, gradient: -0.00\n",
      "loss: -0.00, gradient: -0.00\n",
      "loss: -0.00, gradient: -0.00\n",
      "loss: -0.00, gradient: -0.00\n",
      "loss: -0.00, gradient: -0.00\n",
      "loss: -0.00, gradient: -0.00\n",
      "loss: -0.00, gradient: -0.00\n",
      "loss: -0.00, gradient: -0.00\n",
      "loss: -0.00, gradient: -0.00\n",
      "[-18, -14.4, -11.52, -9.216, -7.3728, -5.8982399999999995, -4.718591999999999, -3.7748735999999994, -3.0198988799999995, -2.4159191039999994, -1.9327352831999995, -1.5461882265599995, -1.2369505812479997, -0.9895604649983998, -0.7916483719987198, -0.6333186975989759, -0.5066549580791807, -0.40532396646334456, -0.32425917317067565, -0.2594073385365405, -0.2075258708292324, -0.16602069666338592, -0.13281655733070874, -0.106253245864567, -0.0850025966916536, -0.06800207735332288, -0.054401661882658305, -0.043521329506126645, -0.03481706360490132, -0.027853650883921055, -0.022282920707136843, -0.017826336565709474, -0.01426106925256758, -0.011408855402054063, -0.00912708432164325, -0.007301667457314601, -0.0058413339658516805, -0.004673067172681344, -0.0037384537381450755, -0.0029907629905160603, -0.002392610392412848, -0.0019140883139302785, -0.0015312706511442227, -0.001225016520915378, -0.0009800132167323025, -0.000784010573385842, -0.0006272084587086736, -0.0005017667669669388, -0.00040141341357355104, -0.0003211307308588408]\n"
     ]
    },
    {
     "data": {
      "image/png": "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xenvydnzdpxdbFp9/vz5AxdeeKFT32XLlqX6OitfjRo1nM83X758gWrVqgUefvjhwNatW53nv/3220CHDh0CZcuWdT6X4sWLB1q2bBlYvnx5kvc5fvx44Pnnn3fOUfbs2QPFihULNGvWLLBixYoTPuMrr7zSOV92sePtc1uzZk2SqedW9uRSOhc2ld7OlU1fZxo6/CDG/uN14AIAAAgVxuwAAICoRtgBAABRjbADAACiGmEHAABENcIOAACIaoQdAAAQ1VhU8J/9Z7Zu3eossMVS6gAARAZbPccW7bRNdZPv85cYYUdygo7tfwMAACLP5s2b01whnrAjOS06wQ/LlnP30rFjxzR37tyEZej9wq/1NtTdf3X3a739XHe/1jvUdd+/f7/TWBH8O54awk6iXYAt6IRD2LENHa0cfvqF8Gu9DXX3X939Wm8/192v9c6sup9sCAoDlAEAQFQj7AAAgKhG2AEAAFGNsAMAAKIaYQcAAEQ1wg4AAIhqhB0AABDVCDsAACCqEXYAAEBUYwXlUImLkxYtkrZtk0qVkq66SoqN9bpUAAD4DmEnFKZPl+6/X/r9938fsw3KXnpJatPGy5IBAOA7dGOFIujceGPSoGO2bHEft+cBAECmIexkdNeVtegEAic+F3ysVy/3OAAAkCkIOxnJxugkb9FJHng2b3aPAwAAmYKwk5FsMHJGHgcAAM4YYScj2ayrjDwOAACcMcJORrLp5TbrKiYm9WPKlHGPAwAAmYKwk5FsHR2bXm5SCzz33cd6OwAAZCLCTkazdXSmTZPOOivp47lyudejRkn793tSNAAA/IiwE6rAs2GDtGCBNGmSe71xo1S2rLRundStW8rT0wEAQIZjBeVQsa6qevWSPjZlijtex67r15fuusur0gEA4Bu07GSmOnWkoUPd27b44Pffe10iAACiHmEns/XuLbVoIR05IrVrJx044HWJAACIaoSdzJYlizRunDuAec0a6Z57GL8DAEAIEXa8ULSoNHmyO65nwgRp7FivSwQAQNQi7HjlyiulwYPd2z16SD/95HWJAACISoQdL/XtKzVtKv39t3TTTdLBg16XCACAqEPY8Xr8zltvuXtl/fyz28IDAAAyFGHHa8WLS++8kzBwOebtt70uEQAAUYWwEw6uuUZ68knnZmzPnsr7++9elwgAgKhB2AkXjz4qNWyomEOH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GYKwg3/H74wZI5UrJ/3vf1K3bozfAQBEBcIO/lWokDt+J2tWdx0eW3wQAIAIR9hBUrVrS888497u1UtaudLrEgEAcEYIOzhR795Sy5bSkSPu+J2//vK6RAAAnDbCDlIevzNunFSmjPTbb9LddzN+BwAQsQg7SFmRItLkyVJsrDRpkjt4GQCACETYQeouv1waMuTfqek//OB1iQAAOGWEHaStTx/p2mulw4fd8TsHD3pdIgAATglhB2nLkkV66y2pdGnpl1+k7t29LhEAAKeEsIOTK1ZMeucdN/iMH+9eAACIEIQdpM/VV0sDB7q3771XWr3a6xIBAJAuhB2kX79+UqNG0qFD7vgduwYAIMwRdpB+Ng19wgSpZEnpp5+k++7zukQAAIR32Bk6dKguu+wy5cuXT8WLF1erVq20Zs2aJMfUq1dPMTExSS532yJ3iWzatEktWrRQ7ty5nffp06ePjh8/nsm18YkSJaSJE//dONRuAwAQxjwNO59//rm6d++upUuXat68eTp27JiaNGmig8mmN3ft2lXbtm1LuDz33HMJz8XFxTlB5+jRo1q8eLHGjx+vcePGqX///h7UyCcaNJCCn+9dd0m//up1iQAASFVWeWjOnDlJ7ltIsZaZFStW6GobEPsPa7EpaV0nKZg7d65Wr16tTz/9VCVKlFD16tU1ePBg9e3bV08++aSyZ88e8nr40hNPWFqVFi50x+8sXSrlzOl1qQAACO8xO/v27XOuCxcunOTxiRMnqmjRoqpatar69eunQ4kGxi5ZskTVqlVzgk5Q06ZNtX//fv1k40oQuvE71oVl09JXrZIeeMDrEgEAEH4tO4nFx8erV69euuKKK5xQE9SxY0eVK1dOpUuX1vfff++02Ni4nunTpzvPb9++PUnQMcH79lxKjhw54lyCLBgZ60azi5eCP9/rcqRLsWKKGTdOsS1bKmbUKB2/6ioFbrop+uudwai7/+ru13r7ue5+rXeo657e94wJBMJjO+t77rlHs2fP1pdffqmzzz471eM+++wzNWzYUGvXrlWFChXUrVs3bdy4UZ988knCMdbykydPHs2aNUvNmjU74T2se2tgcM2YRCZNmuR0meHUVJ4wQedPm6ZjuXLp82HDdLBUKa+LBADwgUOHDjmNItYzlD9//vBu2enRo4dmzpypL774Is2gY2rXru1cB8OOjeX5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P9fdr/UOdd2Df7eDf8dTQ9iR9NdffznXZcqU8booAADgNP6OFyhQINXnYwIni0M+YLukb926Vfny5VNMTHDzeW9YSrXQtXnzZuXPn19+4dd6G+ruv7r7td5+rrtf6x3quluEsaBTunRpZcmS+sgcWnZs4FKWLDr77LMVTuwL4bdfCD/X21B3/9Xdr/X2c939Wu9Q1j2tFp0gBigDAICoRtgBAABRjbATZnLkyKEBAwY4137i13ob6u6/uvu13n6uu1/rHS51Z4AyAACIarTsAACAqEbYAQAAUY2wAwAAohphBwAARDXCTiYbMmSILr/8cuXOnVsFCxY84flx48Y5qzindNm5c2eq73vOOeeccPwzzzyjSKq7SanekydPTvN9//zzT91yyy3OYlX2vl26dNGBAwcUKfVetWqVOnTo4KwwmitXLlWuXFkvvfTSSd83Ws75pk2b1KJFC+eY4sWLq0+fPjp+/HhEn/PkFi5cmOrv9TfffJPq6+rVq3fC8Xfffbcizel8Vw8fPqzu3burSJEiyps3r9q2basdO3YoUmzYsMH5XpYvX975va5QoYIzI+no0aNpvi5Sz/nIkSOd85wzZ07Vrl1bX3/9dZrHT506VZUqVXKOr1atmmbNmhXS8rGCciazL/pNN92kunXrasyYMSc83759e1177bVJHrv99tudX3z7Q5CWQYMGqWvXrgn3bfuLSKp70NixY5N8Bqn9kQyyP3rbtm3TvHnznA3n7rjjDnXr1k2TJk1SJNR7xYoVzrmdMGGCE3gWL17slD82NlY9evSI6nMeFxfnBJ2SJUs69bbz2KlTJ2ezwKeffjpiz3lyFvisvIk98cQTmj9/vmrWrJnma+382nkOslAYiU71u/rAAw/o448/dv4o2gq59rvQpk0bffXVV4oEv/zyi7MV0WuvvaaKFSvqxx9/dOp/8OBBvfDCC1F1zqdMmaLevXtr1KhRTtB58cUX1bRpU61ZsybFv1v2u27/wBs6dKhatmzp/N62atVK3377rapWrRqaQtrUc2S+sWPHBgoUKHDS43bu3BnIli1b4K233krzuHLlygWGDx8eiPS621fy/fffT/d7rV692nnNN998k/DY7NmzAzExMYEtW7YEIvGcm3vvvTdQv379qD/ns2bNCmTJkiWwffv2hMdeffXVQP78+QNHjhyJ+HOemqNHjwaKFSsWGDRoUJrHXXPNNYH7778/EOlO9bu6d+9e5/97U6dOTXjs559/ds77kiVLQlTK0HvuuecC5cuXj7pzXqtWrUD37t0T7sfFxQVKly4dGDp0aIrHt2vXLtCiRYskj9WuXTtw1113hayMdGOFubfeestJ9TfeeONJj7VmYWvyveSSS/T888+ftCsgXFnTddGiRVWrVi29+eabzkZvqVmyZInT8pP4X8eNGjVy9jtbtmyZItW+fftUuHDhqD/ndv6sCbtEiRIJj9m/CG3jwJ9++ilqz/mMGTO0e/dup0XqZCZOnOj8Pti/ePv166dDhw4pEp3Kd9VaO63Fzs5rkHV5lC1b1jn/0f57HUnn/OjRo875Snyu7HfR7qd2ruzxxMcHf+9DeW7pxgpz1vTfsWNHp883Lffdd58uvfRS5xfJmgjtF8SazYcNG6ZIYk23DRo0cALe3Llzde+99zpjMax+Kdm+ffsJzaRZs2Z1Pgd7LhLZ+bNmYWvCj/ZzbucocdAxwfupnb9oOOf2e23/cz/ZBsT2u1+uXDlnR+fvv/9effv2dboGpk+frkhyqt9VO4/Zs2c/oQvbvhuRco6TW7t2rUaMGHHSLqxIO+e7du1yuqNT+j22rrxT+b0P6bkNWZuRj/Tt29dpXk3rYk2wp9qlsXjxYue1y5cvP+UyjRkzJpA1a9bA4cOHA5FY96AnnngicPbZZ6f6/JAhQwLnn3/+CY9bF8F///vfQKTV+4cffggULVo0MHjwYF+c865duwaaNGmS5LGDBw8672FdXOF0zjPqs9i8ebPTdTdt2rRT/nnz58933nPt2rUBr51O3dP7XZ04cWIge/bsJzx+2WWXBR5++OFApNX7999/D1SoUCHQpUuXiD7nKbGuYyuf/b1KrE+fPk73Vkqsi3LSpElJHhs5cmSgePHigVChZScDPPjgg84g4rSce+65p/y+o0ePVvXq1VWjRo1Tfq0NErNmYpsRcMEFFyjS6p64HoMHD9aRI0dS3FfFBrYmn6Vm9bbZOvZcJNV79erVatiwoTPQ9vHHH/fFObdzlHzWRnDGTWrnz6tznlGfhQ3At+6c66+//rTOcbCVwGb3eOlMvgcn+67aebTukb179yZp3bHvRmaf4zOt99atW1W/fn1nkPrrr78e0ec8JdbdZpMpks+US+tc2eOncnxGIOxkgGLFijmXjGRdN++++64zWv10rFy50uk3PdkMrnCse/J6FCpUKNUN5GyWj/0P0fqMg6Hws88+c2ZBBP8nEQn1tvEp1n3XuXNnZ7q2X865nT+rr4WXYLlthpVNKa9SpUpYnfOM+Cxs/JmFneCMs9M5x6ZUqVLy2pl8D072XbXzap+PzVazKefGunJsmQI7/5FS7y1btjhBx+pj593qHMnnPCXW3Wj1s3NlM6qM/S7a/dRmk9o5tOd79eqV8Jj93of03IaszQgp2rhxY+C7774LDBw4MJA3b17ntl3++uuvJMeNHj06kDNnzsCePXtOeI9ly5YFLrjgAqdp1Fjzoc10WLlyZWDdunWBCRMmOE36nTp1CkRS3WfMmBF44403nK6c3377zemSyJ07d6B///6p1t1ce+21gUsuucR57ssvvwycd955gQ4dOgQipd5WXztft956a2Dbtm0JF5uJF+3n/Pjx44GqVas6XVlWlzlz5jj16NevX0Sf89R8+umnqXbvWP2snlYnY90WNlvLurHXr18f+PDDDwPnnntu4Oqrrw5EkvR8V5PX3dx9992BsmXLBj777DPnM6hbt65ziRRWp4oVKwYaNmzo3E78ux1t53zy5MmBHDlyBMaNG+fMluzWrVugYMGCCbMsb7vttsAjjzyScPxXX33ldGO+8MILzu/CgAEDnK4t+39hqBB2Mlnnzp1T7ONdsGBBkuPsl7pjx44pvocda6+xXwazYsUKZ9qejYmwgFS5cuXA008/HfKxGxldd5s+XL16deePYp48eQIXX3xxYNSoUc40xtTqbnbv3u38obPX2ZTlO+6444TwGM71tl/0lJ636brRfs7Nhg0bAs2aNQvkypXLGa/04IMPBo4dOxbR5zw1VubLL788xeesfok/m02bNjl/5AoXLuz8IbE/nDYOYt++fYFIkp7vavK6m7///ttZgqFQoULOP3pat26dJCiEOxunltqYnmg85yNGjHDCqY21srE6S5cuTTKd3v5fkNi7777rjL2z4y+88MLAxx9/HNLyxdh/QtduBAAA4C3W2QEAAFGNsAMAAKIaYQcAAEQ1wg4AAIhqhB0AABDVCDsAACCqEXYAAEBUI+wAAICoRtgBAABRjbADAACiGmEHQNT5448/VLJkST399NMJjy1evNjZodl2WwbgL+yNBSAqzZo1S61atXJCzgUXXKDq1avrhhtu0LBhw7wuGoBMRtgBELW6d++uTz/9VDVr1tQPP/ygb775Rjly5PC6WAAyGWEHQNT6+++/VbVqVW3evFkrVqxQtWrVvC4SAA8wZgdA1Fq3bp22bt2q+Ph4bdiwweviAPAILTsAotLRo0dVq1YtZ6yOjdl58cUXna6s4sWLe100AJmMsAMgKvXp00fTpk3TqlWrlDdvXl1zzTUqUKCAZs6c6XXRAGQyurEARJ2FCxc6LTlvv/228ufPryxZsji3Fy1apFdffdXr4gHIZLTsAACAqEbLDgAAiGqEHQAAENUIOwAAIKoRdgAAQFQj7AAAgKhG2AEAAFGNsAMAAKIaYQcAAEQ1wg4AAIhqhB0AABDVCDsAACCqEXYAAICi2f8Dw7F21junxFkAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "\"\"\"\n",
    "导入必要的库 numpy 和 matplotlib.pyplot。\n",
    "定义目标函数 function(x)，其表达式为 ( y = x^2 + 1 )。\n",
    "设置梯度下降的参数，包括迭代次数 epochs、学习率 lr 和初始值 xi。\n",
    "定义计算梯度的函数 get_gradient(x)，其表达式为 ( 2x )。\n",
    "初始化一个列表 trajectory，用于存储每次迭代的 ( x ) 值。\n",
    "定义梯度下降的主函数 get_x_start(xi)，在每次迭代中：\n",
    "打印当前的损失值（即 ( x ) 值）和梯度。\n",
    "将当前的 ( x ) 值添加到 trajectory 列表中。\n",
    "更新 ( x ) 值，使用公式 ( x = x - \\text{lr} \\times \\text{gradient} )。\n",
    "调用 get_x_start(xi) 函数，开始梯度下降。\n",
    "\n",
    "\"\"\"\n",
    "\n",
    "# 定义目标函数 y = x^2 + 1\n",
    "def function(x):\n",
    "    y = x**2 + 1\n",
    "    return y\n",
    "\n",
    "# 设置梯度下降的参数\n",
    "epochs = 50  # 迭代次数\n",
    "lr = 0.1     # 学习率\n",
    "xi = -18     # 初始值\n",
    "\n",
    "# 定义计算梯度的函数\n",
    "def get_gradient(x):\n",
    "    return 2*x\n",
    "\n",
    "# 初始化一个列表，用于存储每次迭代的 x 值\n",
    "trajectory = []\n",
    "\n",
    "# 定义梯度下降的主函数 get_x_start，用于执行梯度下降算法\n",
    "def get_x_start(xi):\n",
    "    for i in range(epochs):\n",
    "        print(f'loss: {xi:.2f}, gradient: {get_gradient(xi):.2f}')\n",
    "        trajectory.append(xi)\n",
    "        xi = xi - lr * get_gradient(xi)\n",
    "    x_start = xi\n",
    "    return x_start\n",
    "\n",
    "# 调用 get_x_start 函数，开始梯度下降\n",
    "get_x_start(xi)\n",
    "print(trajectory)\n",
    "\n",
    "plt.plot(trajectory, [function(x) for x in trajectory], 'ro-')\n",
    "# plt.axis([-20, 20, 0, 400])\n",
    "plt.xlabel('x')\n",
    "plt.ylabel('y')\n",
    "plt.title('Gradient Descent')\n",
    "plt.grid()\n",
    "plt.show()\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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L7/80mrQoIG5hRrBToimKusPcma3tLZt22bddttt5s34yiuvNL/ITqLTJDPr46effmoe//jjj606deqYQKFw4cJmmuwbb7xhpv+6oX9q3759VsuWLa2CBQuaC41egC5cuGA50ZYtW6z69eubN6sCBQpYN9xwg/XKK6845o02KxMnTjRvrvnz5zdT0Tdt2mS5wYMPPmiVK1fO9EvfP/Tz3bt3W06mv1uZ/c7p76J/+vmLL75o/lDU9039g3LXrl2WG/qnAYH+4aR/YOj0bF0GomfPno4KzCWL655eE/00MH3yySfN0iv6x2/79u3TJQJCJebSAQIAALgSs7EAAICrEewAAABXI9gBAACuRrADAABcjWAHAAC4GsEOAABwNYIdAADgagQ7AADA1Qh2AACAqxHsAAAAVyPYAeA6P//8s9kh+5VXXkm9b8OGDWYndN1xGYC3sDcWAFdaunSptGvXzgQ5VatWlTp16kjbtm1l7NixkT40AGFGsAPAtXr37i2rVq2Sm2++WbZv3y6bN2+WhISESB8WgDAj2AHgWn/88YfUqFFDDhw4IFu2bJGaNWtG+pAARABjdgC41p49e+TQoUOSnJws+/bti/ThAIgQMjsAXOn8+fNSr149M1ZHx+yMHz/elLJKly4d6UMDEGYEOwBcacCAATJv3jzZtm2bFClSRO644w4pVqyYLFmyJNKHBiDMKGMBcJ01a9aYTM57770niYmJEhsba/6/fv16ef311yN9eADCjMwOAABwNTI7AADA1Qh2AACAqxHsAAAAVyPYAQAArkawAwAAXI1gBwAAuBrBDgAAcDWCHQAA4GoEOwAAwNUIdgAAgKsR7AAAAFcj2AEAAOJm/x8+HomJoPdbGQAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "def function(x):\n",
    "    y = x**2 + 1\n",
    "    return y\n",
    "\n",
    "\n",
    "# print()\n",
    "# print([function(x) for x in trajectory])\n",
    "\n",
    "plt.plot(np.arange(-20, 20, 0.1), [function(x) for x in np.arange(-20, 20, 0.1)], 'ro-')\n",
    "plt.xlabel('x')\n",
    "plt.ylabel('y')\n",
    "plt.title('Objective Function')\n",
    "plt.grid()\n",
    "plt.show()\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss: -18.0000, gradient: -36.0000\n",
      "loss: -14.4000, gradient: -28.8000\n",
      "loss: -11.5200, gradient: -23.0400\n",
      "loss: -9.2160, gradient: -18.4320\n",
      "loss: -7.3728, gradient: -14.7456\n",
      "loss: -5.8982, gradient: -11.7965\n",
      "loss: -4.7186, gradient: -9.4372\n",
      "loss: -3.7749, gradient: -7.5497\n",
      "loss: -3.0199, gradient: -6.0398\n",
      "loss: -2.4159, gradient: -4.8318\n",
      "loss: -1.9327, gradient: -3.8655\n",
      "loss: -1.5462, gradient: -3.0924\n",
      "loss: -1.2370, gradient: -2.4739\n",
      "loss: -0.9896, gradient: -1.9791\n",
      "loss: -0.7916, gradient: -1.5833\n",
      "loss: -0.6333, gradient: -1.2666\n",
      "loss: -0.5067, gradient: -1.0133\n",
      "loss: -0.4053, gradient: -0.8106\n",
      "loss: -0.3243, gradient: -0.6485\n",
      "loss: -0.2594, gradient: -0.5188\n",
      "loss: -0.2075, gradient: -0.4151\n",
      "loss: -0.1660, gradient: -0.3320\n",
      "loss: -0.1328, gradient: -0.2656\n",
      "loss: -0.1063, gradient: -0.2125\n",
      "loss: -0.0850, gradient: -0.1700\n",
      "loss: -0.0680, gradient: -0.1360\n",
      "loss: -0.0544, gradient: -0.1088\n",
      "loss: -0.0435, gradient: -0.0870\n",
      "loss: -0.0348, gradient: -0.0696\n",
      "loss: -0.0279, gradient: -0.0557\n",
      "loss: -0.0223, gradient: -0.0446\n",
      "loss: -0.0178, gradient: -0.0357\n",
      "loss: -0.0143, gradient: -0.0285\n",
      "loss: -0.0114, gradient: -0.0228\n",
      "loss: -0.0091, gradient: -0.0183\n",
      "loss: -0.0073, gradient: -0.0146\n",
      "loss: -0.0058, gradient: -0.0117\n",
      "loss: -0.0047, gradient: -0.0093\n",
      "loss: -0.0037, gradient: -0.0075\n",
      "loss: -0.0030, gradient: -0.0060\n",
      "loss: -0.0024, gradient: -0.0048\n",
      "loss: -0.0019, gradient: -0.0038\n",
      "loss: -0.0015, gradient: -0.0031\n",
      "loss: -0.0012, gradient: -0.0025\n",
      "loss: -0.0010, gradient: -0.0020\n",
      "loss: -0.0008, gradient: -0.0016\n",
      "loss: -0.0006, gradient: -0.0013\n",
      "loss: -0.0005, gradient: -0.0010\n",
      "loss: -0.0004, gradient: -0.0008\n",
      "loss: -0.0003, gradient: -0.0006\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjsAAAHHCAYAAABZbpmkAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAASKxJREFUeJzt3QmcTfX/x/H3LPZ9XwoplTX6kVIqu0hlqWwVkvxE/aXSTpS0/aiktKJFRNpUIkspRCppjyjZdyGMmft/fM7pTjNjZgxm5tx7zuv5eFz33nPPvff7vTNm3vNdY0KhUEgAAAA+Fet1AQAAAHISYQcAAPgaYQcAAPgaYQcAAPgaYQcAAPgaYQcAAPgaYQcAAPgaYQcAAPgaYQcAAPgaYQdAtuvZs6dOOumkVMdiYmJ03333eVYmAMFF2AF8ZPXq1RowYIBOO+00FSxY0LnUrFlT/fv317fffiu/mzRpkh5//PEsn2+BzEKYXWJjY1W8eHHVqVNH119/vb744gv50fr1653Q+c0333hdFCDXxOfeWwHISTNmzFDnzp0VHx+v7t27q27dus4v8J9++knTp0/XM88844ShKlWqeFK+v//+2ylbToed7777TgMHDszyc+rVq6dbbrnFuf3XX3/pxx9/1NSpU/X888/r5ptv1qhRo+S3sDNs2DAn6FndgSAg7AA+sGrVKnXp0sUJMnPmzFGFChVSPf7www/r6aefdsJPZvbu3atChQrlSBnz58+vSHTCCSfoqquuOuzz6tatm0aPHq1TTz1V/fr186x8AI4f3ViADzzyyCNOUBk/fvxhQcdYi8pNN92kSpUqpRpXU7hwYScotW3bVkWKFHFahMyCBQt0xRVXqHLlysqXL5/zPGvlsNaZtN5++23Vrl3bCTN2/dZbb6VbxvTG7Kxbt07XXnutypUr57xPrVq19NJLL6U6Z/78+c5z33jjDY0YMUInnnii817NmzfXypUrk89r0qSJ3n//ff3+++/JXVNpxw1lVYECBfTKK6+oZMmSznuGQqHkx5KSkpyuMiurlcPK3rdvX+3YsSPVa3z55Zdq3bq1Spcu7bxe1apVnbqmZK/1xBNPOF1n9lplypTRRRdd5Dw3pVdffVX169d3XsfKZMF27dq1qc6x+tvn/8MPP6hp06ZOF6YFOfveSPlZnnXWWc7tXr16JX9OEyZMOKbPCYgWtOwAPunCqlatms4+++yjet6hQ4ecX8iNGzfWY4895vyCNNaNs2/fPqdFo1SpUlqyZInGjBmjP//803ksbNasWerUqZMzLmjkyJHatm2b80vUAsmRbNq0Seecc47zy9bGGdkv+g8//FC9e/fW7t27D+uKeuihh5yWqVtvvVW7du1yfolbOAuPrbn77rud41ZGa5ExFuaOlT23Q4cOevHFF50AYeHGWLCxcGD1tABpXYNPPfWUvv76a33++efKkyePNm/erFatWjl1uuOOO5yxQGvWrHG6E1OyutprtWnTRtddd53z9bCguXjxYjVo0MA5x8LWvffeqyuvvNI5Z8uWLc7X4oILLnDe0147zAKXhaWOHTs650+bNk233367E6bsPWrUqKHhw4dryJAhzrik888/33neueeee8yfExAVQgCi2q5du6zZIdS+ffvDHtuxY0doy5YtyZd9+/YlP9ajRw/neXfcccdhz0t5XtjIkSNDMTExod9//z35WL169UIVKlQI7dy5M/nYrFmznNetUqVKqufbsaFDhybf7927t/PcrVu3pjqvS5cuoWLFiiWXYd68ec5za9SoETpw4EDyeU888YRzfMWKFcnHLr744sPeNzN2rj0nI6NHj3be45133nHuL1iwwLn/2muvpTpv5syZqY6/9dZbzv2lS5dm+Npz5851zrnpppsOeywpKcm5XrNmTSguLi40YsSIVI9bnePj41Mdv/DCC53Xe/nll5OP2edVvnz5UKdOnZKPWZnsvPHjx2f62QB+QjcWEOWsFSSjVgzr2rDWhfBl7Nixh52T3ngU6y4Js+6xrVu3On/9W2ax1gSzYcMGZ0ZPjx49VKxYseTzW7Zs6bT0ZMZe580339Qll1zi3LbXD1+spclaaL766qtUz7GWlLx58ybfD7dK/Pbbb8op4c/UBi4ba9WyulodU5bZupjs3Hnz5jnnhVtbrMUtISEh3de2+lur1tChQw97zI4bawmyri5rpUn5fuXLl3fGEoXfL2V5U44/ss+rYcOGOfoZAdGAbiwgytlYG7Nnz57DHnv22WedX9TWZZR2EG54LE96XU5//PGH09Xx7rvvHjYWxYKIsbExxn7ppnX66acfFlZSsq6YnTt36rnnnnMu6bGuoJRs/FBKJUqUcK7Tli87hT/T8Gf866+/OvUvW7ZspmW+8MILne49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Uv786T8WHrxsqzHTpQUEHmEHQHSylp0NGzJ+3ALP2rXueQACjbADIDplFnSO5TwAvkXYARCdKlTI2nllyuR0SQBEOMIOgOh0/vnurKuYmMzPu/126YcfcqtUACIQYQdAdK+7Y9IGnvD9QoWkr76S/vMfdzf1pKTcLycAz0V02LnvvvsUExOT6lK9evXkx/fv36/+/furVKlSKly4sDp16qRNmzZ5WmYAucjW0bG9smxLiZSsxefNN6VffpHatJEOHJAGDZKaN5fWrPGqtAA8EtFhx9SqVUsbNmxIvnz22WfJj91888167733NHXqVH3yySdav369OrKIGBAs9n/eAsy8edKkSe716tXu8YoVpfffl5591m3lsdWVbcr6+PHsrQUESMSvoBwfH6/y5csfdnzXrl168cUXNWnSJDVr1sw5Nn78eNWoUUOLFy/WOeec40FpAXjWpdWkSfqPWZeW7aNlrTo9ekiffy5de6301lvS889L5crldmkB5LKIb9n59ddfVbFiRZ188snq3r27/vjjD+f4smXLlJCQoBYtWiSfa11clStX1qJFizwsMYCIdMop0iefuDum580rvfeeu9UEqywDvhfRLTtnn322JkyYoNNPP93pwho2bJjOP/98fffdd9q4caPy5s2r4sWLp3pOuXLlnMcyc+DAAecStnv3bufawpNdvBR+f6/LkduCWm9D3XO57jffLLVoofhevRTz7bdSp05K6t5diTaAOc3Pk5zC1zx4dQ9qvXO67ll9zZhQKHo6rnfu3KkqVapo1KhRKlCggHr16pUqtJiGDRuqadOmetj+estk4LMFp7SsS6xgwYI5UnYAkSUmIUHVp0zRqdOnKyYpSX+XKqWvb7pJW+rW9bpoALJo37596tatmzO0pWjRov4IO+ass85yuq5atmyp5s2ba8eOHaladywMDRw40Bm8fDQtO5UqVdLWrVsz/bByg6XU2bNnO/XLkyePgiKo9TbU3du6xyxerLhrr1XMypXO/cQbblDSgw9KOfiHTyTU2ytBrXtQ653Tdbff36VLlz5i2Inobqy09uzZo1WrVunqq69W/fr1nQ9tzpw5zpRz8/PPPztjeho1apTp6+TLl8+5pGWvFynfhJFUltwU1Hob6p7Hu8UJv/lGGjxYevppxdnl44+ll1+2vvQcfWu+5sGre1DrnVN1z+rrRfQA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3q6tnzO83kS1atVUuHDhwwKN9Yca69o60ro80Vxv67qyoGM/CG0KY7iv1/5iyM5AFYl1t646CzU2NfmRRx5x6m6tWtbl46fdky3U2VgVC7M2rd7WHnn++ee1evVqZ+q9X1lotTEr1i1r60hZwLExeca6Nfws7bhD+3439nPO1hDzMws6Ni7Lvt6PPfaYtmzZkvxYNLTYHg37mW3/r63FrmHDhnr88cedSQi21EKuytW5X8hUjx49nKmXaS/z5s1L93w77oep50eq99ChQ9N9vEqVKqEgfM3XrFkTatOmTahAgQKh0qVLh2655RZnyrLfLF26NNSqVatQyZIlQ0WKFAmdc845zrRkvzt48KDzNS1btqxT7xYtWoS+++67UNCsXr06MFPPbamJ9P7f+/VX8pgxY0KVK1cO5c2b15mKvnjx4lwvQ4z9k7vxCgAAIPf4r5MQAAAgBcIOAADwNcIOAADwNcIOAADwNcIOAADwNcIOAADwNcIOAADwNcIOAADwNcIOAADwNcIOAADwNcIOAN+xjRVtQ8UHH3ww+djChQudXZhtx2UAwcLeWAB86YMPPlD79u2dkHP66aerXr16uuyyyzRq1CiviwYglxF2APhW//799fHHH6tBgwZasWKFli5dqnz58nldLAC5jLADwLf+/vtv1a5dW2vXrtWyZctUp04dr4sEwAOM2QHgW6tWrdL69euVlJSkNWvWeF0cAB6hZQeALx08eFANGzZ0xurYmJ3HH3/c6coqW7as10UDkMsIOwB86bbbbtO0adO0fPlyFS5cWBdeeKGKFSumGTNmeF00ALmMbiwAvjN//nynJeeVV15R0aJFFRsb69xesGCBnnnmGa+LByCX0bIDAAB8jZYdAADga4QdAADga4QdAADga4QdAADga4QdAADga4QdAADga4QdAADga4QdAADga4QdAADga4QdAADga4QdAADga4QdAAAgP/t/5knNpJToZ8kAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 简化版\n",
    "\"\"\"\n",
    "线性回归的目标是找到一条直线，使得所有样本点到直线的距离之和最小。\n",
    "这个距离可以用损失函数来表示，通常使用均方误差（MSE）来表示。\n",
    "\n",
    "MSE 的表达式为：( MSE = \\frac{1}{n} \\sum_{i=1}^{n} (y_i - (w \\times x_i + b))^2 )。\n",
    "其中，( y_i ) 是真实值，( x_i ) 是特征值，( w ) 是权重，( b ) 是偏置。\n",
    "梯度下降的目标是最小化损失函数，即找到最优的 ( w ) 和 ( b )。\n",
    "\n",
    "梯度下降的步骤如下：\n",
    "计算损失函数关于 ( w ) 和 ( b ) 的梯度。\n",
    "更新 ( w ) 和 ( b ) 的值，使得损失函数最小。\n",
    "重复步骤 1 和 2，直到损失函数收敛。\n",
    "\n",
    "\"\"\"\n",
    "def function(x):\n",
    "    y = x**2 + 1\n",
    "    return y\n",
    "\n",
    "# 设置梯度下降的参数\n",
    "epochs = 50  # 迭代次数\n",
    "lr = 0.1     # 学习率\n",
    "xi = -18     # 初始值\n",
    "\n",
    "trajectory = []\n",
    "\n",
    "def get_gradient(x):\n",
    "    return 2*x\n",
    "\n",
    "for i in range(epochs):\n",
    "    print(f'loss: {xi:.4f}, gradient: {get_gradient(xi):.4f}')\n",
    "    # 梯度下降值 = 当前值 - 学习率 * 梯度\n",
    "    xi = xi - lr * get_gradient(xi)\n",
    "    trajectory.append(xi)\n",
    "\n",
    "plt.plot(trajectory, [function(x) for x in trajectory], 'ro-')\n",
    "plt.xlabel('x')\n",
    "plt.ylabel('y')\n",
    "plt.title('Gradient Descent')\n",
    "plt.grid()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1: Loss = 1.3345, w = 0.6715, b = -0.0322\n",
      "Epoch 2: Loss = 0.7803, w = 0.6012, b = 0.1414\n",
      "Epoch 3: Loss = 0.4742, w = 0.5552, b = 0.2733\n",
      "Epoch 4: Loss = 0.3038, w = 0.5270, b = 0.3741\n",
      "Epoch 5: Loss = 0.2075, w = 0.5117, b = 0.4520\n",
      "Epoch 6: Loss = 0.1519, w = 0.5057, b = 0.5128\n",
      "Epoch 7: Loss = 0.1187, w = 0.5064, b = 0.5608\n",
      "Epoch 8: Loss = 0.0979, w = 0.5119, b = 0.5993\n",
      "Epoch 9: Loss = 0.0841, w = 0.5206, b = 0.6306\n",
      "Epoch 10: Loss = 0.0743, w = 0.5316, b = 0.6565\n",
      "Epoch 11: Loss = 0.0668, w = 0.5441, b = 0.6784\n",
      "Epoch 12: Loss = 0.0607, w = 0.5575, b = 0.6971\n",
      "Epoch 13: Loss = 0.0556, w = 0.5715, b = 0.7135\n",
      "Epoch 14: Loss = 0.0511, w = 0.5857, b = 0.7279\n",
      "Epoch 15: Loss = 0.0471, w = 0.5999, b = 0.7409\n",
      "Epoch 16: Loss = 0.0435, w = 0.6140, b = 0.7527\n",
      "Epoch 17: Loss = 0.0402, w = 0.6279, b = 0.7636\n",
      "Epoch 18: Loss = 0.0372, w = 0.6415, b = 0.7736\n",
      "Epoch 19: Loss = 0.0344, w = 0.6547, b = 0.7831\n",
      "Epoch 20: Loss = 0.0318, w = 0.6675, b = 0.7919\n",
      "Epoch 21: Loss = 0.0294, w = 0.6800, b = 0.8003\n",
      "Epoch 22: Loss = 0.0272, w = 0.6920, b = 0.8082\n",
      "Epoch 23: Loss = 0.0251, w = 0.7036, b = 0.8158\n",
      "Epoch 24: Loss = 0.0233, w = 0.7148, b = 0.8230\n",
      "Epoch 25: Loss = 0.0215, w = 0.7256, b = 0.8299\n",
      "Epoch 26: Loss = 0.0199, w = 0.7361, b = 0.8365\n",
      "Epoch 27: Loss = 0.0184, w = 0.7461, b = 0.8428\n",
      "Epoch 28: Loss = 0.0170, w = 0.7558, b = 0.8488\n",
      "Epoch 29: Loss = 0.0158, w = 0.7651, b = 0.8546\n",
      "Epoch 30: Loss = 0.0146, w = 0.7740, b = 0.8602\n",
      "Epoch 31: Loss = 0.0135, w = 0.7827, b = 0.8656\n",
      "Epoch 32: Loss = 0.0125, w = 0.7909, b = 0.8707\n",
      "Epoch 33: Loss = 0.0115, w = 0.7989, b = 0.8757\n",
      "Epoch 34: Loss = 0.0107, w = 0.8066, b = 0.8804\n",
      "Epoch 35: Loss = 0.0099, w = 0.8140, b = 0.8850\n",
      "Epoch 36: Loss = 0.0091, w = 0.8211, b = 0.8894\n",
      "Epoch 37: Loss = 0.0084, w = 0.8279, b = 0.8936\n",
      "Epoch 38: Loss = 0.0078, w = 0.8345, b = 0.8977\n",
      "Epoch 39: Loss = 0.0072, w = 0.8408, b = 0.9016\n",
      "Epoch 40: Loss = 0.0067, w = 0.8469, b = 0.9054\n",
      "Epoch 41: Loss = 0.0062, w = 0.8527, b = 0.9090\n",
      "Epoch 42: Loss = 0.0057, w = 0.8584, b = 0.9125\n",
      "Epoch 43: Loss = 0.0053, w = 0.8638, b = 0.9158\n",
      "Epoch 44: Loss = 0.0049, w = 0.8690, b = 0.9190\n",
      "Epoch 45: Loss = 0.0045, w = 0.8740, b = 0.9221\n",
      "Epoch 46: Loss = 0.0042, w = 0.8788, b = 0.9251\n",
      "Epoch 47: Loss = 0.0039, w = 0.8834, b = 0.9280\n",
      "Epoch 48: Loss = 0.0036, w = 0.8879, b = 0.9307\n",
      "Epoch 49: Loss = 0.0033, w = 0.8922, b = 0.9333\n",
      "Epoch 50: Loss = 0.0031, w = 0.8963, b = 0.9359\n",
      "Final model: y = 0.8963 * x + 0.9359\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# 定义线性回归的损失函数\n",
    "def mse_loss(y_true, y_pred):\n",
    "    return np.mean((y_true - y_pred) ** 2)\n",
    "\n",
    "# 定义线性回归的预测函数\n",
    "def predict(x, w, b):\n",
    "    return w * x + b\n",
    "\n",
    "# 设置梯度下降的参数\n",
    "epochs = 50  # 迭代次数\n",
    "lr = 0.1     # 学习率\n",
    "\n",
    "# 初始化权重和偏置\n",
    "w = np.random.randn()\n",
    "b = np.random.randn()\n",
    "\n",
    "# 示例数据\n",
    "x = np.union1d(np.random.randint(-1, 1, 100), [0])\n",
    "y = x + 1\n",
    "\n",
    "# 梯度下降\n",
    "for i in range(epochs):\n",
    "    y_pred = predict(x, w, b)\n",
    "    loss = mse_loss(y, y_pred)\n",
    "    \n",
    "    # 计算梯度\n",
    "    dw = -2 * np.mean(x * (y - y_pred))\n",
    "    db = -2 * np.mean(y - y_pred)\n",
    "    \n",
    "    # 更新权重和偏置\n",
    "    w = w - lr * dw\n",
    "    b = b - lr * db\n",
    "    \n",
    "    print(f'Epoch {i+1}: Loss = {loss:.4f}, w = {w:.4f}, b = {b:.4f}')\n",
    "\n",
    "print(f'Final model: y = {w:.4f} * x + {b:.4f}')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1: Loss = 456943.8326, w = 9.5025, b = 0.6425\n",
      "Epoch 101: Loss = 0.0464, w = 9.9911, b = 0.6478\n",
      "Epoch 201: Loss = 0.0462, w = 9.9912, b = 0.6463\n",
      "Epoch 301: Loss = 0.0460, w = 9.9912, b = 0.6449\n",
      "Epoch 401: Loss = 0.0458, w = 9.9912, b = 0.6435\n",
      "Epoch 501: Loss = 0.0456, w = 9.9912, b = 0.6421\n",
      "Epoch 601: Loss = 0.0454, w = 9.9912, b = 0.6406\n",
      "Epoch 701: Loss = 0.0452, w = 9.9913, b = 0.6392\n",
      "Epoch 801: Loss = 0.0450, w = 9.9913, b = 0.6378\n",
      "Epoch 901: Loss = 0.0448, w = 9.9913, b = 0.6364\n",
      "Final model: y = 9.9913 * x + 0.6350\n",
      "Predicted price for room size 75 is 749.98\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "\n",
    "# 定义线性回归的损失函数\n",
    "def mse_loss(y_true, y_pred):\n",
    "    return np.mean((y_true - y_pred) ** 2)\n",
    "\n",
    "# 定义线性回归的预测函数\n",
    "def predict(x, w, b):\n",
    "    return w * x + b\n",
    "\n",
    "# 设置梯度下降的参数\n",
    "epochs = 1000  # 迭代次数\n",
    "lr = 0.0001   # 学习率\n",
    "\n",
    "# 初始化权重和偏置\n",
    "w = np.random.randn()\n",
    "b = np.random.randn()\n",
    "\n",
    "# 示例数据（房间大小和对应的房价）\n",
    "x = np.array([30, 40, 50, 60, 70, 80, 90, 100])  # 房间大小\n",
    "y = np.array([300, 400, 500, 600, 700, 800, 900, 1000])  # 房价\n",
    "\n",
    "# 梯度下降\n",
    "for i in range(epochs):\n",
    "    y_pred = predict(x, w, b)\n",
    "    loss = mse_loss(y, y_pred)\n",
    "    \n",
    "    # 计算梯度\n",
    "    dw = -2 * np.mean(x * (y - y_pred))\n",
    "    db = -2 * np.mean(y - y_pred)\n",
    "    \n",
    "    # 更新权重和偏置\n",
    "    w = w - lr * dw\n",
    "    b = b - lr * db\n",
    "    \n",
    "    if i % 100 == 0:\n",
    "        print(f'Epoch {i+1}: Loss = {loss:.4f}, w = {w:.4f}, b = {b:.4f}')\n",
    "\n",
    "print(f'Final model: y = {w:.4f} * x + {b:.4f}')\n",
    "\n",
    "# 预测房价\n",
    "room_size = 75\n",
    "predicted_price = predict(room_size, w, b)\n",
    "print(f'Predicted price for room size {room_size} is {predicted_price:.2f}')"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
